import re
import numpy as np


def isNaNo(sth):
    if not sth:
        return True
    if isinstance(sth, float):
        if np.isnan(sth):
            return True
    return False


def flag_match_0(one_mulu):
    '''
    匹配最高缩进标识，匹配到此标识，缩进级别都设为0
    :param mulu:
    :return:
    '''
    # if one_mulu.startswith(('绪论', )):
    #     return True

    if one_mulu.startswith(('目录', '绪论', '开场白', '前言', '总序', '致谢', '序言', '鸣谢', '作者简介', '编者的话')):
        return True

    pattern = r'(第)' \
              r'(' \
              r'\d{1,4}' \
              r'|[一|二|三|四|五|六|七|八|九|十|百|零|〇]{1,6}' \
              r'|[Ⅰ|Ⅱ|Ⅲ|Ⅳ|Ⅴ|Ⅵ|Ⅶ|Ⅷ|Ⅸ|Ⅹ|Ⅺ|Ⅻ]{1,6}' \
              r'|[壹|贰|叁|肆|伍|陆|柒|捌|玖|拾|佰|仟]{1,6}' \
              r')' \
              r'(部分)'
    matchObj = re.match(pattern, one_mulu)
    if matchObj:
        return True

    return False


def flag_match_1(one_mulu):
    '''
    匹配“缩进标识”：第X章
    :param mulu:
    :return:
    '''
    # if one_mulu.startswith(('绪论', )):
    #     return True
    pattern = r'(第)' \
              r'(' \
              r'\d{1,4}' \
              r'|[一|二|三|四|五|六|七|八|九|十|百|零|〇]{1,6}' \
              r'|[Ⅰ|Ⅱ|Ⅲ|Ⅳ|Ⅴ|Ⅵ|Ⅶ|Ⅷ|Ⅸ|Ⅹ|Ⅺ|Ⅻ]{1,6}' \
              r'|[壹|贰|叁|肆|伍|陆|柒|捌|玖|拾|佰|仟]{1,6}' \
              r')' \
              r'(章)'
    matchObj = re.match(pattern, one_mulu)
    if matchObj:
        return True

    return False

def flag_match_2(one_mulu):
    '''
    匹配“缩进标识”：第X篇
    :param mulu:
    :return:
    '''
    # if one_mulu.startswith(('绪论', )):
    #     return True
    pattern = r'(第)' \
              r'(' \
              r'\d{1,4}' \
              r'|[一|二|三|四|五|六|七|八|九|十|百|零|〇]{1,6}' \
              r'|[Ⅰ|Ⅱ|Ⅲ|Ⅳ|Ⅴ|Ⅵ|Ⅶ|Ⅷ|Ⅸ|Ⅹ|Ⅺ|Ⅻ]{1,6}' \
              r'|[壹|贰|叁|肆|伍|陆|柒|捌|玖|拾|佰|仟]{1,6}' \
              r')' \
              r'(篇)'
    matchObj = re.match(pattern, one_mulu)
    if matchObj:
        return True

    return False

def flag_match_3(one_mulu):
    '''
    匹配“缩进标识”：第X节
    :param mulu:
    :return:
    '''
    # if one_mulu.startswith(('绪论', )):
    #     return True
    pattern = r'(第)' \
              r'(' \
              r'\d{1,4}' \
              r'|[一|二|三|四|五|六|七|八|九|十|百|零|〇]{1,6}' \
              r'|[Ⅰ|Ⅱ|Ⅲ|Ⅳ|Ⅴ|Ⅵ|Ⅶ|Ⅷ|Ⅸ|Ⅹ|Ⅺ|Ⅻ]{1,6}' \
              r'|[壹|贰|叁|肆|伍|陆|柒|捌|玖|拾|佰|仟]{1,6}' \
              r')' \
              r'(节)'
    matchObj = re.match(pattern, one_mulu)
    if matchObj:
        return True

    return False

def flag_match_4(one_mulu):
    '''
    匹配“缩进标识”：A、B、C.D.E.
    :param mulu:
    :return:
    '''
    # if one_mulu.startswith(('绪论', )):
    #     return True
    pattern = r'[A|B|C|D|E|F|G]{1,6}(、|\.){1}'
    matchObj = re.match(pattern, one_mulu)
    if matchObj:
        return True

    return False

def flag_match_5(one_mulu):
    '''
    匹配“缩进标识”：一、二、三.四.五.
    :param mulu:
    :return:
    '''
    # if one_mulu.startswith(('绪论', )):
    #     return True
    pattern = r'[一|二|三|四|五|六|七|八|九|十|百|零|〇]{1,6}(、|\.){1}'
    matchObj = re.match(pattern, one_mulu)
    if matchObj:
        return True

    return False

def flag_match_6(one_mulu):
    '''
    匹配“缩进标识”：1 2 3 4 5 6
    :param mulu:
    :return:
    '''
    pattern = r'\d{1,2}'
    matchObj = re.match(pattern, one_mulu)
    if matchObj:
        return True

    return False


def get_level_flag(mulu_list):
    '''
    给目录定级：[目录缩进标识, 当前行数, 缩进级别]， 具体格式如下
    [
        ['flag_1', 0, 0],
        ['flag_3', 1, 1],
        ['flag_3', 2, 1],
        ['flag_3', 3, 1]
    ]
    方法：首先将不同“缩进标识”归类成“flag_X”， 再根据标识首次出现的顺序确定缩进的级别
    （例如“flag_3”最先出现，那么所有“flag_3”的缩进级别都是最高级别0，之后以此类推）
    :param mulu_list:
    :return:
    '''
    level_list = []
    for idx, mulu in enumerate(mulu_list):
        if flag_match_0(mulu):
            level_list.append(['flag_root', idx])
        # elif flag_match_1(
        elif mulu.startswith(('习题', '...', '主要参考文献', '参考文献', '小结', '实验', '课后练习', '附...', '本章小结')):
            level_list.append(['flag_follow_father', idx])
        elif flag_match_1(mulu):
            level_list.append(['flag_1', idx])
        elif flag_match_2(mulu):
            level_list.append(['flag_2', idx])
        elif flag_match_3(mulu):
            level_list.append(['flag_3', idx])
        elif flag_match_4(mulu):
            level_list.append(['flag_4', idx])
        elif flag_match_5(mulu):
            level_list.append(['flag_5', idx])
        elif flag_match_6(mulu):
            level_list.append(['flag_6', idx])
        else:
            level_list.append(['flag_other', idx])

    level_list = add_level(level_list)


    return level_list

def add_level(level_list):
    '''
    为每行插入缩进级别
    "flag_root"标识的目录直接定为0级，其他标识按照首次出现的次序依次定级
    :param level_list:
    :return:
    '''
    flag_list = []

    for idx, lv in enumerate(level_list):
        if lv[0] not in flag_list:
            if lv[0] != 'flag_root':
                flag_list.append(lv[0])
    # print(flag_list)
    new_level_list = []
    for idx, lv in enumerate(level_list):
        if lv[0] == 'flag_root':     # 如果缩进级标识root，那么缩进级别给0
            cur_level = 0
        elif lv[0] == 'flag_follow_father':    # 如果缩进标识是follow，那么缩进级别和上一行目录保持一致，如果已经是第一行了，那么级别给0
            cur_level = new_level_list[idx-1][-1] if idx > 0 else 0
        else:
            cur_level = flag_list.index(lv[0])
        new_level_list.append(lv + [cur_level])

    return new_level_list


def mulu_arrange(mulu_list):
    level_list = get_level_flag(mulu_list)

    new_mulu_list = []

    for idx, ml in enumerate(mulu_list):
        # print(ml)

        ml = ' ' * (level_list[idx][2] * 4) + ml

        new_mulu_list.append(ml)

    print('---------------------')
    print('level_list: {}'.format(level_list))
    for ml in new_mulu_list:
        print(ml)
    print('---------------------')

    return new_mulu_list


if __name__ == '__main__':
    mulu_list = ['第一章建筑工程资料管理概述', '第一节建筑工程资料的基本知识', '第二节建筑工程资料管理的意义与职责', '第三节工程文件的归档要求', '第四节工程文件的组卷',
                 '第五节建筑工程档案的验收与移交', '第二章工程准备阶段资料', '第一节工程准备阶段资料管理', '第二节决策立项阶段文件', '第三节建设用地、征地、拆迁文件', '第四节勘察、测绘、设计文件',
                 '第五节招投标文件', '第六节开工审批文件', '第七节工程质量监督手续', '第八节财务文件', '第九节工程竣工验收文件', '第三章监理资料', '第一节监理单位文件资料管理流程',
                 '第二节监理管理资料', '第三节进度控制资料', '第四节质量控制资料', '第五节造价控制资料', '第六节分包资质资料', '第七节合同管理资料', '第四章施工资料', '第一节施工资料管理流程',
                 '第二节施工管理资料', '第三节质量控制管理资料', '第四节工程施工质量验收资料', '第五节建筑与结构工程安全和功能检验资料', '第五章竣工图、竣工验收及备案资料',
                 '第六章建筑工程资料管理软件及应用附录参考文献...查看更多']

    new_mulu_list = mulu_arrange(mulu_list)
    print(new_mulu_list)